﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Day04
{
    class Program
    {
        static void Main1(string[] args)
        {
            //界面
            //需求：存储数据
            //问题：存储方式变化，客户端（脚本）代码需要修改。
            //目标：客户端代码只做存储，不涉及具体存储方式。
            // 不许new XXDao();

            //添加用户
            if (GameMain.Type == "Client")
            {
                ClientUserDao client = new ClientUserDao();
                client.Add(new User());
            }
            else
            {
                ServerUserDao server = new ServerUserDao();
                server.Add(new User());
            }
            
        }
        //抽象工厂模式
        static void Main(string[] args)
        {
            //ClientUserDao dao = new ClientUserDao();//还是new了
            //dao.Add(new User());

            //引入接口
            //IUserDao userDao = new ClientUserDao();//提出接口，还是new了
            //userDao.Add(new User());

            //引入DaoFactory工厂
            //         new ClientUserDao()
            //DaoFactory.UserDao.Add(new User());//不new了，new在工厂中进行

            //最终版，添加对用户数据的操作
            DaoFactory.Instance.UserDao.Add(new User());//实际开发这么写
            //调用流程                          执行流程
            //1.调用抽象工厂的自身类型静态属性  1.创建具体工厂（客户端/服务端）
            //2.调用抽象工厂的接口类型实例属性  2.创建接口实现类对象（执行具体工厂属性）
            //3.调用接口的方法。                3.执行接口实现类方法。
            //DaoFactory factory = DaoFactory.Instance;//选择客户端/服务端
            //IUserDao dao = factory.UserDao;//选择对**数据操作
            //dao.Add(new User());//选择操作

            //添加对武器的操作
            DaoFactory.Instance.WeaponDao.Add(new Weapon());

            //优点：
            //1.客户端（脚本）代码无需调用具体的实现类。【切换】方便
            //2.客户端代码（脚本）与数据访问对象同时开发【并行开发】
            //缺点：
            //1.如果系统层功能变更，影响非常大。例如增加一个接口，则抽象工厂DaoFactory需要增加抽象接口，则其所有子工厂都要增加接口抽象方法

            /*
             * 练习：主城堡受伤，警报响起。
             * 温馨提示：将来还会有其他物体受影响。
             */
        }
    }
}
